const fs = require('fs')
const path = require('path')
const micromatch = require('micromatch')
const chalk = require('chalk')

/**
 * 匹配
 * @param {*} regArr
 * @param {*} str
 * @return {*}
 */
function isMatch(regArr, str) {
  return micromatch.contains(str, regArr)
}

/**
 * 获取目录的全部文件列表
 * @param {*} dirPath 路径
 * @param {number} [type=0] 类型 0：文件和目录 1：文件 2：目录
 * @param {number} [depth=0] 寻找的目录深度 0：不限制 0<：循环的深度
 * @param {array} [regArr=['*.js']] 正则匹配包含的路径，包含的才会扫描和添加
 * @param {array} [regIgnoreArr=['node_modules']] 正则匹配忽略的目录或文件名列表
 * @return {*}
 */
function getFileList(dirPath, type = 0, depth = 0, regArr = ['*.js'], regIgnoreArr = ['node_modules']) {
  let listData = []

  var fileNameArr = fs.readdirSync(dirPath)

  //普通目录合成
  for (var fileName of fileNameArr) {
    var tempFilePath = path.join(dirPath, fileName)
    // 是否跳过忽略
    let isIgnore = false

    var isDir = fs.statSync(tempFilePath).isDirectory()

    if (isDir) {
      let tempDirPath = tempFilePath
      // 添加目录
      if (type == 0 || type == 2) {
        // 包含正则匹配，只有有一条匹配就添加
        isIgnore = isMatch(regArr, tempFilePath)
        if (!isIgnore) {
          // console.log('居然不包含', regArr, tempFilePath)
          continue
        }

        // 忽略正则匹配
        isIgnore = isMatch(regIgnoreArr, tempFilePath)
        if (isIgnore) {
          // console.log('居然包含', regIgnoreArr, tempFilePath)
          continue
        }
        listData.push(tempDirPath)
      }

      // 深度判断
      if (depth > 1 || depth === 0) {
        let tempDepth = 0
        if (depth > 1) {
          tempDepth = depth - 1
        }
        let arrList = getFileList(tempFilePath, type, tempDepth, regArr, regIgnoreArr)
        listData = listData.concat(arrList)
      }
    } else {
      if (type == 0 || type == 1) {
        // 包含正则匹配，只有有一条匹配就添加
        isIgnore = isMatch(regArr, tempFilePath)
        if (!isIgnore) {
          // console.log('居然不包含', regArr, tempFilePath)
          continue
        }

        // 忽略正则匹配
        isIgnore = isMatch(regIgnoreArr, tempFilePath)
        if (isIgnore) {
          // console.log('居然包含', regIgnoreArr, tempFilePath)
          continue
        }
        listData.push(tempFilePath)
      }
    }
  }
  return listData
}

/**
 * 用正则表达式实现html转码
 * @param {*} str
 * @return {*}
 */
function htmlEncodeByRegExp(str) {
  var s = ''
  if (str.length == 0) return ''
  str = str.toString()
  s = str.replace(/&/g, '&amp;')
  s = s.replace(/</g, '&lt;')
  s = s.replace(/>/g, '&gt;')
  s = s.replace(/ /g, '&nbsp;')
  s = s.replace(/\'/g, '&#39;')
  s = s.replace(/\"/g, '&quot;')
  return s
}

/**
 *  输出成功的控制台信息
 * @param {*} params
 */
function successLog(...params) {
  let msg = chalk.black.bgGreen(' SUCCESS ')
  params.unshift(msg)
  params.push('\n')
  let log = console.log
  log.apply(console, params)
}

/**
 *  输出的控制台信息
 * @param {*} params
 */
function infoLog(...params) {
  let msg = chalk.black.bgWhite(' INFO ')
  params.unshift(msg)
  params.push('\n')
  let log = console.log
  log.apply(console, params)
}

/**
 *  输出错误的控制台信息
 * @param {*} params
 */
function errorLog(...params) {
  let msg = chalk.black.bgRed(' ERROR ')
  params.unshift(msg)
  params.push('\n')
  let log = console.log
  log.apply(console, params)
}

module.exports = {
  htmlEncodeByRegExp,
  getFileList,
  successLog,
  infoLog,
  errorLog,
  isMatch
}
